
Attribute VB_Name = "math"
Function errmath(ByVal текст As String, ByVal эталон As String) As Variant
  Dim xT(), zT() 'массивы для сопоставления
  Dim ps As Double: ps = rwOpts("ps") 'порог схожести
  Dim ml As Long:   ml = rwOpts("ls") 'длина сопоставления
  Dim rM(9) 'массив результатов
  
  While InStr(эталон, "  ") > 0 'убираем двойные пробелы
    эталон = Replace(эталон, "  ", " ")
  Wend
  
  rM(8) = Len(эталон) 'размер эталона в символах
  If rwOpts("tv") = 0 Then rM(9) = tTime Else rM(9) = rwOpts("tv") * 1000 'время запоминания
  For i = 0 To 5 'назначаем тип числовым резалтам
    rM(i) = CDbl(0)
  Next
  rM(6) = "": rM(7) = ""
  
  t1 = Split(текст): t2 = Split(Trim(эталон))
  ReDim xT(UBound(t1), 3)
  ReDim zT(UBound(t2), 3)
  
 '0 - уникальность в своём тексте (число повторов)
  For i = 0 To UBound(t1)
    For n = 0 To UBound(t1)
      If t1(i) = t1(n) Then xT(i, 0) = xT(i, 0) + 1
    Next
    
   '1 - позиция при точном совпадении
   '3 - тип ошибки (для подсветки)
    For M = 0 To UBound(t2)
      If t1(i) = t2(M) Then
        xT(i, 1) = M
        zT(M, 1) = i
        xT(i, 3) = 1: zT(M, 3) = 1 'Tcolor
        Exit For
      End If
    Next
  Next
  
  For i = 0 To UBound(t2)
    For n = 0 To UBound(t2)
      If t2(i) = t2(n) Then zT(i, 0) = zT(i, 0) + 1
    Next
    
   '2 - максимальный процент совпадения с похожим словом
    If IsEmpty(zT(i, 1)) Then
      imMax = 0
      For M = 0 To UBound(t1)
        If IsEmpty(xT(M, 1)) Then 'если слово "свободно"
          imVal = IndistinctMatching(ml, CStr(t2(i)), CStr(t1(M)), 1) 'сопоставляем его с ненайденным
          imVal = imVal * Len(t1(M)) / Len(t2(i)) 'увеличиваем* кофф-т совпадения на разницу длин
          If imVal > imMax Then imMax = imVal: T = M 'запоминаем лучшую схожесть
        End If
      Next
      If imMax > ps Then 'сцепляем позиции
        xT(T, 1) = i 'бронируем слово
        zT(i, 1) = T
        zT(i, 2) = imMax
        xT(T, 3) = 2: zT(i, 3) = 2 'Tcolor
      End If
    End If
  Next
  
  'Подбиваем итоги:
  'rM(0) пропущено слов
  'rM(1) совпавших слов
  'rM(2) ошибочных слов
  'rM(3) средний коэфф-т совпадения rM(2)
  'rM(4) перестановок
  'rM(7) - подсветка эталона
  For i = 0 To UBound(zT)
    If IsEmpty(zT(i, 1)) Then
      rM(0) = rM(0) + 1
      zT(i, 3) = 0 'Tcolor
    Else
      If IsEmpty(zT(i, 2)) Then
        rM(1) = rM(1) + 1
      Else
        rM(2) = rM(2) + 1
        rM(3) = rM(3) + zT(i, 2)
      End If
      If i > 0 Then
        If zT(i, 1) < poz Then
          rM(4) = rM(4) + 1
          zT(i, 3) = zT(i, 3) + 6               'Tcolor
          xT(zT(i, 1), 3) = xT(zT(i, 1), 3) + 6 'Tcolor
          xT(poz, 3) = xT(poz, 3) + 6           'Tcolor
          zT(poz, 3) = zT(poz, 3) + 6           'Tcolor
        End If
            poz = zT(i, 1)
      Else: poz = zT(0, 1)
      End If
    End If
    rM(7) = rM(7) & zT(i, 3)
  Next
  If rM(2) > 0 Then rM(3) = Val(rM(3) / rM(2)) / 100
  
  'rM(5) лишних слов
  'rM(6) - подсветка текста
  For i = 0 To UBound(xT)
    If IsEmpty(xT(i, 1)) Then
      rM(5) = rM(5) + 1
      xT(i, 3) = 5 'Tcolor
    End If
    rM(6) = rM(6) & xT(i, 3)
  Next

  errmath = rM
End Function

